#define _CRT_SECURE_NO_WARNINGS 1
#include <exception>
#include <iostream>
#include <utility>
#include <unordered_map>
#include <queue>
#include <algorithm>
using namespace std;
//using pii = pair<int, int>;
//int n = 0;
//class A
//{
//public:
//    bool operator()(pii p1, pii p2)
//    {
//        if (p1.second != p2.second)
//        {
//            return p1.second < p2.second;
//        }
//        else
//        {
//            return abs(n - p1.first) < abs(n - p2.first);
//        }
//    }
//};
//int main()
//{
//    cin >> n;
//    cerr << "n=" << n << endl;
//    vector<int> v(n, 0);
//    for (int i = 0;i < n;i++)
//    {
//        cin >> v[i];
//    }
//
//    int score = 0;
//    while (true)
//    {
//        cerr << "---" << endl;
//        priority_queue<pii, vector<pii>, A> pq;
//        for (int i = 0;i < v.size();i++)
//        {
//            pq.push(make_pair(i, v[i]));
//        }
//        if (pq.empty()) break;
//        int i = pq.top().first;
//        score += pq.top().second;
//        int e1, e2, e3;
//        if (i + 1 < v.size()) e1 = v[i + 1];
//        e2 = v[i];
//        if (i - 1 >= 0) e3 = v[i - 1];
//        while (!pq.empty())
//        {
//            cerr << pq.top().first << " " << pq.top().second << endl;
//            pq.pop();
//        }
//        if (i + 1 < v.size())
//        {
//            auto it = find(v.begin(), v.end(), e1);
//            v.erase(it);
//        }
//        auto it1 = find(v.begin(), v.end(), e2);
//        v.erase(it1);
//        if (i - 1 >= 0)
//        {
//            auto it = find(v.begin(), v.end(), e3);
//            v.erase(it);
//        }
//    }
//    cerr << score << endl;
//    cout << score << endl;
//    return 0;
//}


//int main()
//{
//    int n = 0;
//    cin >> n;
//    cerr << "n=" << n << endl;
//    vector<int> v(n, 0);
//    for (int i = 0;i < n;i++)
//    {
//        cin >> v[i];
//        cerr << v[i] << " ";
//    }
//    cerr << endl;
//    unordered_map<int, int> m;
//    for (auto& a : v)
//    {
//        m[a] += 1;
//    }
//    cerr << endl;
//    int score = 0;
//    while (!m.empty())
//    {
//        for (auto& a : m)
//        {
//            cerr << a.first << " " << a.second << endl;
//        }
//        int maxk = 0;
//        int max = 0;;
//        for (auto& a : m)
//        {
//            if (a.first * a.second >= max)
//            {
//                max = a.first * a.second;
//                maxk = a.first;
//            }
//        }
//        score += maxk * m[maxk];
//        m.erase(maxk);
//        cerr << "maxk=" << maxk << endl;
//        m.erase(maxk - 1);
//        m.erase(maxk + 1);
//        cerr << "------" << endl;
//    }
//    cerr << score << endl;
//    cout << score << endl;
//    return 0;
//}
//


int main()
{
    int n = 0;
    cin >> n;
    cerr << "n=" << n << endl;
    vector<int> v(n, 0);
    for (int i = 0;i < n;i++)
    {
        cin >> v[i];
        //cerr<<v[i]<<" ";
    }
    cerr << endl;
    unordered_map<int, int> m;
    for (auto& a : v)
    {
        m[a] += 1;
    }
    int score = 0;
    while (!m.empty())
    {
        for (auto& a : m)
        {
            cerr << a.first << " " << a.second << endl;
        }
        bool flag = true;
        int max = 0;
        int maxk = 0;
        for (auto& a : m)
        {
            int i1 = a.first - 1, i2 = i1 + 1, i3 = i1 + 2;
            if (m[i2] * i2 > max)
            {
                max = m[i2] * i2;
                maxk = i2;
            }
            cerr << "i=" << i1 << " " << i2 << " " << i3 << endl;
            if (i2 > max) max = i2;
            if (m[i2] * i2 > (m[i1] * i1 + m[i3] * i3))
            {
                score += m[i2] * i2;
                m.erase(i1);
                m.erase(i2);
                m.erase(i3);
                flag = false;
                cerr << "erase" << endl;
                for (auto& a : m)
                {
                    cerr << a.first << " " << a.second << endl;
                }
                break;
            }
            if (m[i1] == 0) m.erase(i1);
            if (m[i3] == 0) m.erase(i3);
        }
        if (flag)
        {
            cerr << "maxk=" << maxk << endl;
            score += m[maxk] * maxk;
            m.erase(maxk - 1);
            m.erase(maxk);
            m.erase(maxk + 1);
            cerr << "erase" << endl;
            for (auto& a : m)
            {
                cerr << a.first << " " << a.second << endl;
            }
        }
        cerr << "------" << endl;
    }
    cerr << score << endl;
    cout << score << endl;
    return 0;
}
